<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>作用域链</title>
</head>
<body>
<a href="http://www.ido321.com/1641.html">作用域链</a>
<p>
    Javascript中有一个执行环境(execution context)的概念，它定义了变量或函数有权访问的其它数据，决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象，环境中定义的所有变量和函数都保存在这个对象中。你可以把它当做Javascript的一个普通对象，但是你只能修改它的属性，却不能引用它。
    变量对象也是有父作用域的。当访问一个变量时，解释器会首先在当前作用域查找标示符，如果没有找到，就去父作用域找，直到找到该变量的标示符或者不再存在父作用域了，这就是作用域链。
    作用域链和原型继承有点类似，但又有点小区别：如果去查找一个普通对象的属性时，在当前对象和其原型中都找不到时，会返回undefined；但查找的属性在作用域链中不存在的话就会抛出ReferenceError。
    作用域链的顶端是全局对象。对于全局环境中的代码，作用域链只包含一个元素：全局对象。所以，在全局环境中定义变量的时候，它们就会被定义到全局对象中。当函数被调用的时候，作用域链就会包含多个作用域对象。
</p>
<script>
    "use strict";
    var foo = 1; var bar = 2;
    function myFunc()
    {
        var a = 1; var b = 2; var foo = 3;
        console.log('inside myFunc');
    }
//    console.log('outside');
    myFunc();
</script>
</body>
</html>